package com.ts.mediacodec.EGL

import android.content.Context
import android.opengl.GLES20
import android.opengl.GLES20.GL_FLOAT
import android.opengl.GLES20.GL_UNSIGNED_INT
import android.opengl.GLES20.glEnableVertexAttribArray
import android.opengl.GLES20.glVertexAttribPointer
import android.opengl.GLES30
import android.util.Log
import com.ts.audiocamera.R
import com.ts.opengl.simpleDraw.openglUtil

class ScreenRender {
    private val POINT_RECT_DATA2 = floatArrayOf(
        // positions         //color              // texture coords
        -1.0f,  1.0f, 0.0f,   1.0f, 0.0f, 0.0f,   0.0f, 0.0f, // top right
        -1.0f, -1.0f, 0.0f,   1.0f, 0.0f, 1.0f,   0.0f, 1.0f, // bottom right
        1.0f, 1.0f, 0.0f,   1.0f, 0.0f, 1.0f,   1.0f,0.0f, // bottom left
        1.0f,  -1.0f, 0.0f,   0.0f, 0.5f, 1.0f,   1.0f, 1.0f  // top left
    )

    private val indeices = intArrayOf(
        // 注意索引从0开始!
        // 此例的索引(0,1,2,3)就是顶点数组vertices的下标，
        // 这样可以由下标代表顶点组合成矩形

        0, 1, 2, // 第一个三角形
        1, 2, 3  // 第二个三角形
    )

    var vao=IntArray(1)

    var ebo=IntArray(1)
    private  val TAG = "ScreenRender"
    fun checkGlError(op: String) {
        val error = GLES20.glGetError()
        if (error != GLES20.GL_NO_ERROR) {
            val msg = op + ": glError 0x" + Integer.toHexString(error)
            Log.e(TAG, "checkGlError"+ msg)
        }
    }

    val verbuffer by lazy{
        openglUtil.createFloatBuffer(POINT_RECT_DATA2);
    }



    var program=0;
    var mWidth: Int = 0
    var mHeight: Int = 0
    var vbo=IntArray(2);
    fun setSize(width: Int, height: Int) {
        mWidth = width
        mHeight = height
    }

    var vTexture=0;

    constructor(context:Context){
        program=openglUtil.createProgram(context, R.raw.camera_encode_ver,R.raw.camera_encode_frag);

        checkGlError("glEnableVertexAttribArray22 1")
        val indexData=openglUtil.createIntBuffer(indeices)

        checkGlError("glEnableVertexAttribArray22 2")
        //使用 vbo,vao 优化数据传递
        //创建 VAO
        GLES30.glGenVertexArrays(1, vao, 0)
        checkGlError("glEnableVertexAttribArray22 3")
        // //创建 VBO
        GLES30.glGenBuffers(1, vbo, 0)
        checkGlError("glEnableVertexAttribArray22 4")
        //绑定 VAO ,之后再绑定 VBO
        GLES30.glBindVertexArray(vao[0])
        checkGlError("glEnableVertexAttribArray22 5")
        //绑定VBO
        GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, vbo[0])
        checkGlError("glEnableVertexAttribArray22 6")
        GLES30.glBufferData(
            GLES30.GL_ARRAY_BUFFER,
            verbuffer.capacity() * 4,
            verbuffer,
            GLES30.GL_STATIC_DRAW
        )
        checkGlError("glEnableVertexAttribArray22 7")
        //创建 ebo
        GLES30.glGenBuffers(1, ebo, 0)
        //绑定 ebo 到上下文
        GLES30.glBindBuffer(GLES30.GL_ELEMENT_ARRAY_BUFFER, ebo[0])
        checkGlError("glEnableVertexAttribArray22 8")
        //昂丁
        GLES30.glBufferData(
            GLES30.GL_ELEMENT_ARRAY_BUFFER,
            indexData.capacity() * 4,
            indexData,
            GLES30.GL_STATIC_DRAW
        )
        checkGlError("glEnableVertexAttribArray22 9")

        //位置信息解析
        verbuffer.position(0)
        glVertexAttribPointer(0,3, GL_FLOAT,false,8*4,0)
        glEnableVertexAttribArray(0)
        checkGlError("glEnableVertexAttribArray22 10")
        verbuffer.position(3)
        glVertexAttribPointer(1,3, GL_FLOAT,false,8*4,3*4)
        GLES30.glEnableVertexAttribArray(1)
        checkGlError("glEnableVertexAttribArray22 11")

        verbuffer.position(6)
        GLES30.glVertexAttribPointer(
            2, 2, GLES30.GL_FLOAT,
            false, 8 * 4, 6*4 //需要指定颜色的地址 3 * 4
        )
        GLES30.glEnableVertexAttribArray(2)
        checkGlError("glEnableVertexAttribArray22 12")

        GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, 0)
        GLES30.glBindVertexArray(0)
        //注意顺序，ebo 要在 eao 之后
        GLES30.glBindBuffer(GLES30.GL_ELEMENT_ARRAY_BUFFER, 0)
        checkGlError("glEnableVertexAttribArray22 13")
        //采样点的坐标
        vTexture = GLES20.glGetUniformLocation(program, "sampel")

    }


    fun draw(texture:Int){

        Log.e(TAG, "$texture---")
        GLES20.glViewport(0, 0, mWidth, mHeight)

        GLES30.glUseProgram(program)

       checkGlError("glEnableVertexAttribArray22 vvvvv")
        //生成一个采样  纹理使用的是什么采样器 ，两种 1   普通采样  限定在GPU
//          GL_TEXTURE_2D  GPU内存1     GL_TEXTURE_EXTERNAL_OES 外接设备
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texture)
        GLES20.glUniform1i(vTexture, 0)
        GLES30.glBindVertexArray(vao[0])
//        checkGlError("glEnableVertexAttribArray2232323")
        //真正开始渲染
        GLES30.glDrawElements(GLES30.GL_TRIANGLE_STRIP,6, GL_UNSIGNED_INT,0)


    }
}